package dancereal;

import java.util.Scanner;

public class J32_Exception {

	/* 예외처리 exception
	 * 오류 처리는 프로그래밍 언어의 중요한 기능임
	 * 좋은 오류 처리 매커니즘은 프로그래머가 보다
	 * 쉽게 강력한 프로그램을 작성하고 
	 * 몰래 섞여 들어오는 버그를 방지할 수 있음
	 * 
	 * 일부 언어에서는 발생가능한 모든 오류를 
	 * 미리 감지하기 위해 강제로 다중 if 문을 사용
	 * 이런 경우 코드가 지나치게 복잡해 짐 
	 * 
	 * 자바에서는 try 문을 사용하여 
	 * 보다 쉽게 오류를 감지하고 처리 
	 * 
	 * 오류 error versus exception 예외
	 * 프로그램의 정상실행을 방해하는 요소
	 * 오류 : 프로그램의 잘못된 코드나
	 *      CPU 연산의 잘못된 동작으로 발생
	 * 		컴파일 오류, 실행시간 오류로 다시 분류 
	 * * 컴파일 오류 : 잘못된 문법으로 인해 발생된 오류
	 * * 실행시간 오류 : 잘못된 코드사용이나 
	 * 				하드웨어 오동작으로 인한 오류
	 * 
	 * 하드웨어적으로 발생하는 오류를 제외하고
	 * 모든 오류는 개발자가 적절히 수정 가능			
	 * 
	 * 예외 : 일반적인 프로그램 실행 순서를 벗어나는 것
	 * 프로그램 상에서 코드에 의해 예외를 바로 잡을수 있음
	 * 즉, 위에서 언급한 오류들은 코드에 의해 수습할 수 
	 * 있는 미약한 오류라는 의미도 있음
	 * 
	 * 실행시간 오류가 생길 것 같은 코드는
	 * 일반적으로 try - catch - finally 문으로 격리 가능
	 * 오류가 발생하면 try 블록의 처리를 중단하고
	 * catch 블록으로 제어가 넘어감
	 * 
	 */
	
	public static void main(String[] args) {
	// 오류가 발생하는 경우 - 코드 무시
		System.out.println("이 글이 보이나요?");
	//	System.out.println(100/10); // 무시
		System.out.println("이 글도 보이나요?");
	
	// 오류가 발생하는 경우 - 코드 무시
		System.out.println("이 글이 보이나요?");
		try{
		System.out.println(100/0);
		}catch(Exception e){
		//System.out.println("0으로 나눌수 없어요!");
		//	e.printStackTrace();
			System.out.println(e.getMessage());
		}
		System.out.println("이 글도 보이나요?");
		
	// 1 - 10 사이 정수를 입력 받아 출력하는 프로그램
	
		//while(true){
		Scanner sc = new Scanner(System.in);	
		System.out.println("1 - 10 사이 정수를 입력하세요");
		int num = 0;
		try{
		num = sc.nextInt();
		System.out.println("입력하신 정수는 " + num);
		}catch(Exception e){
		System.err.println("입력값이 범위를 초과하였습니다.");
		/*이전에 입력한 내용이 문자인 경우
		 * Scanner 내부 저장소(버퍼)에 남아있기 때문에
		 * 계속 무한반복으로 위 문장이 출력됨
		 * Scanner 를 다시 초기화해야만 문제가 해결 
		} while*/
		}
	
	// 예외 처리 1
	 int[] name = new int[3];
	 try{
	 name[0] = 1;
	 name[1] = 2;
	 name[2] = 3;
	 name[3] = 4;
	 }catch(Exception ex){
		 System.err.println("배열의 크기 초과");
	 }
	// 예외 처리 2
	 int result = 0;
	 try{
	 for(int i = 10; i >= 0; --i){
		 result += (int)Math.random() * 100/ i;}
		 System.out.println(result);
	}catch (Exception e){
		System.err.println("0으로 나눌 수 없어요");
	} 
	// 다중 예외 처리
	/* try{
	 System.out.println(100/0);
	 char[] grade = new char[3];
	 grade[3] = 'a';
	 }catch (Exception e){
		 System.err.println("0으로 나누지 못함");
	 }*/
	 
	 try{
		 System.out.println(100/0);
		 char[] grade = new char[3];
		 grade[3] = 'a';
		 }catch (ArithmeticException ae){
			 System.err.println("0으로 나누지 못함2");
		 }catch (ArrayIndexOutOfBoundsException aiobe){
			 System.err.println("배열의 범위를 벗어났어요");
		 }catch(Exception e){
			 System.out.println("알 수 없는 오류 발생");
		 }
	 /* 코드에서 발생할 수 있는 예외가
	  * 하나 이상인 경우 다중 catch 문으로
	  * 각각의 예외에 따라 독자적인 오류처리를 할 수 있음
	  */
	  
	}//main 
}// class